package br.com.advocacia.faces;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import br.com.advocacia.entidade.Bairro;
import br.com.advocacia.entidade.Cidade;
import br.com.advocacia.logica.contract.BairroLogicaContract;
import br.com.advocacia.logica.contract.DefaultLogicaContract;
import br.com.advocacia.util.FacesUtil;
import br.com.advocacia.util.StringUtil;

@ManagedBean(name="bairroFaces")
@ViewScoped
public class BairroFaces extends FacesUtil {
	
	private static final long serialVersionUID = 4620989756344415646L;

	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<Bairro> logicaBairro;
	
	@ManagedProperty(value = "#{bairroLogica}")
	private BairroLogicaContract bairroLogica;
	
	private Cidade cidade;
	private Bairro bairro = new Bairro();
	private List<Bairro> listaBairro = new ArrayList<>();
	private String bairroBusca;
	
	public BairroFaces() {
		if (getSession().getAttribute("cidadeSelecionada") != null) {
			this.cidade = (Cidade) getSession().getAttribute("cidadeSelecionada");

		} else {
			adicionarMensagem("Cidade não selecionada");
		}
	}
	
	@PostConstruct
	public void init() {
		this.buscarBairro(cidade);		
	}

	public void adicionar() {
		try {
			if (validaCampos()) {
				logicaBairro.adicionar(bairro);
				adicionarMensagem("Bairro adicionada com sucesso");
				this.buscarBairro(cidade);
				fecharModal("dialogBairro");
			} else {
				return;
			}
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao adicionar a Bairro");
		}
	}
	
	public void prepararAdicionar() {
		this.bairro = new Bairro();
		abrirModal("dialogBairro");
	}
	
	public void selecionarRegistro(Long idArea, boolean editar) {
		try {
			this.bairro = logicaBairro.obterPorId(Bairro.class,idArea);
			
			if (editar) {
				abrirModal("dialogBairro");
			} else {
				abrirModal("dialogExcluir");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void editar() {
		try {
			if (validaCampos()) {
				logicaBairro.editar(this.bairro);
				adicionarMensagem("Bairro editado com sucesso");
				fecharModal("dialogBairro");
				this.buscarBairro(cidade);
			} else {
				return;
			}
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao editar a Bairro");
		}
	}
	
	public void remover() {
		try {
			logicaBairro.remover(Bairro.class, this.bairro.getId());
			adicionarMensagem("Bairro removido com sucesso");
			fecharModal("dialogExcluir");
			this.buscarBairro(cidade);
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao remover a Bairro");
		}
	}
	
	public void buscarBairro(Cidade cidade) {
		if (listaBairro != null) {
			this.listaBairro.clear();
		}
		
		try {
			this.listaBairro = bairroLogica.buscarBairrosPorCidade(this.cidade.getId(), bairroBusca);
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao buscar as informações");
		}
	}
	
	public boolean validaCampos() {
		boolean valido = true;
		this.bairro.setCidade(this.cidade);
		
		if (!StringUtil.textoPreenchido(this.bairro.getNomeBairro())) {
			adicionarMensagem("O campo nome é obrigatório");
			valido = false;
		}
		return valido;
	}
	
	public void bairrosPorBairro(Bairro bairro) {
		getSession().setAttribute("bairroSelecionado", bairro);
		redirecionarPagina("bairro.faces");
	}
	
	public void setLogicaBairro(DefaultLogicaContract<Bairro> logicaBairro) {
		this.logicaBairro = logicaBairro;
	}

	public List<Bairro> getListaBairro() {
		return listaBairro;
	}

	public void setListaBairro(List<Bairro> listaBairro) {
		this.listaBairro = listaBairro;
	}

	public String getBairroBusca() {
		return bairroBusca;
	}

	public void setBairroBusca(String bairroBusca) {
		this.bairroBusca = bairroBusca;
	}

	public Bairro getBairro() {
		return bairro;
	}

	public void setBairro(Bairro bairro) {
		this.bairro = bairro;
	}

	public Cidade getCidade() {
		return cidade;
	}

	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}

	public void setBairroLogica(BairroLogicaContract bairroLogica) {
		this.bairroLogica = bairroLogica;
	}
	
	
}